/**
 * 装饰器工厂 -- 创建一个函数  这个函数返回的是装饰器
 *  因为函数可以接收参数  就可以根据参数 动态修改装饰器
 */

{
  const MusicDecoratorFactory = (type: string): ClassDecorator => {
    // 返回的是类装饰器 所以这个函数是  装饰器工厂函数

    /**
     * 基于这个工厂函数 多了传参的能力 让我们呢得以使用更少的代码 开发和封装装饰器
     */
    switch (type) {
      case "Tank":
        return (target: Function) => {
          target.prototype.play = () => {
            console.log("播放坦克音乐");
          };
        };
      default:
        return (target: Function) => {
          target.prototype.play = () => {
            console.log("播放主角音乐");
          };
        };
    }
  };

  @MusicDecoratorFactory("Tank")
  class Tank {}
  (new Tank() as any).play();

  @MusicDecoratorFactory("Hero")
  class Hero {}
  (new Hero() as any).play();
}
